7.2.6 容器进程

7.2.5节中启动Ubuntu容器之时,让容器运行Bash Shell( /bin/bash )。这使得Bash Shell成为 容器中运行的且唯一运行的进程 。读者可以通过 ps -elf 命令在容器内部查看。

root@3027eb644874:/# ps -elf
F S UID 4 PID PPID     NI ADDR SZ WCHAN  STIME TTY    TIME      CMD
 S root 0  1    0      0 - 4558  wait   00:47 ?    00:00:00  /bin/bash
  R root  11    1      0 - 8604  -      00:52 ?    00:00:00  ps -elf

上面的输出中看起来好像有两个正在运行的进程,其实并非如此。列表中PID为1的进程,是容器被告知要运行的Bash Shell;第二个进程是 ps -elf 命令产生的,这是个临时进程,并且在输出后就已经退出了。也就是说,这个容器当前只运行了一个进程—— /bin/bash

注:

Windows容器有所不同,通常会运行相当多的进程。

这意味着如果通过输入exit退出Bash Shell,那么容器也会退出(终止)。原因是容器如果不运行任何进程则无法存在——杀死Bash Shell即杀死了容器唯一运行的进程,导致这个容器也被杀死。这对于Windows容器来说也是一样的—— 杀死容器中的主进程,则容器也会被杀死

按下 Ctrl-PQ 组合键则会退出容器但并不终止容器运行。这样做会切回到Docker主机的Shell,并保持容器在后台运行。可以使用 docker container ls 命令来观察当前系统正在运行的容器列表。

$ docker container ls
CNTNR ID  IMAGE          COMMAND    CREATED   STATUS     NAMES
302..74  ubuntu:latest  /bin/bash  6 mins    Up 6mins   sick_montalcini

当前容器仍然在运行,并且可以通过 docker container exec 命令将终端重新连接到Docker,理解这一点很重要。

$ docker container exec -it 3027eb644874 bash
root@3027eb644874:/#

用于重连Windows Nano Server PowerShell容器的命令是 docker container exec -it <container-name-or-ID> pwsh.exe

正如读者所见,Shell提示符切换到了容器。如果读者再次运行 ps 命令,会看到两个Bash或者PowerShell进程,这是因为 docker container exec 命令创建了新的Bash或者PowerShell进程并且连接到容器。这意味着在当前Shell输入 exit 并不会导致容器终止,因为原Bash或者PowerShell进程还在运行当中。

输入exit退出容器,并通过命令 docker container ps 来确认容器依然在运行中。果然容器还在运行。

如果在自己的Docker主机上运行示例,则需要使用下面两个命令来停止并删除容器(读者需要将ID替换为自己容器的ID)。

$ docker container stop 3027eb64487
3027eb64487
$ docker container rm 3027eb64487
3027eb64487

results matching ""

    No results matching ""